package ar.utn.frgp.banco.service.impl;

import ar.utn.frgp.banco.dao.ClientesDAO;
import ar.utn.frgp.banco.entity.Cliente;
import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.exceptions.DataAccessException;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.exceptions.ServiceException;
import ar.utn.frgp.banco.service.EBAbstractService;
import ar.utn.frgp.banco.service.OperacionesClienteServ;

public class OperacionesClienteServImpl extends EBAbstractService implements OperacionesClienteServ{

	private ClientesDAO clientesDAO;
	
	public void crearCliente(Cliente cliente) throws ServiceException,
			PersonalisedException {
		
		if (cliente != null) {
			if (!existeCliente(cliente.getDni())) {
				try {
					clientesDAO.altaCliente(cliente);
				} catch (DataAccessException e) {
					throw new ServiceException("Error de acceso a BD."
							+ e.getMessage());
				}
			} else {
				throw new PersonalisedException("El cliente ya existe");
			}
		} else {
			throw new ServiceException("El objeto cliente es null");
		}
		
	}

	public void crearCuenta(Cliente cliente, Cuenta cuenta)
			throws ServiceException, PersonalisedException {
		// TODO Auto-generated method stub
		
	}
	
	private boolean existeCliente(String dni) throws PersonalisedException {
		try {
			Cliente cl = clientesDAO.obtenerCliente(dni);

			if (cl != null)
				return true;

			return false;
		} catch (DataAccessException e) {
			return false;
		}
	}
	public ClientesDAO getClientesDAO() {
		return clientesDAO;
	}

	public void setClientesDAO(ClientesDAO clientesDAO) {
		this.clientesDAO = clientesDAO;
	}

	

	public void deleteCliente(String dni) throws ServiceException,
			PersonalisedException {
		
		Cliente cliente = commonDAO.load(Cliente.class, dni);
		try {
			commonDAO.delete(cliente);			
		} catch (DataAccessException e) {
			throw new PersonalisedException("No se pudo eliminar el cliente");
		}
		
		
	}

	public Cliente searchCliente(String dni) throws ServiceException,
			PersonalisedException {
		if(dni != null){
			try {
				Cliente cliente = clientesDAO.getCliente(dni);
				if(cliente != null){
					return cliente;					
				}else {
					throw new PersonalisedException("El cliente no existe");
				}
			} catch (DataAccessException e) {
				throw new ServiceException("Error de acceso a BD."
						+ e.getMessage());
			}
		} return null;
		
		
	}
	
	public void modificarCliente(Cliente cliente) throws ServiceException,
	PersonalisedException {

		Cliente clienteModif = commonDAO.load(Cliente.class, cliente.getDni());
		
		if (clienteModif != null) {
			clienteModif.setDireccion(cliente.getDireccion());
			clienteModif.setMail(cliente.getMail());
			clienteModif.setClave(cliente.getClave());
			
				try {
					commonDAO.save(clienteModif);
				} catch (DataAccessException e) {
					throw new ServiceException("Error al modificar datos de cliente"
							+ e.getMessage());
				}
			
		} else {
			throw new ServiceException("No existe el cliente");
		}
		
		
	}

	
}
